/*
如果两个进程互相等待对方持有并且不释放的资源时，则这两个进程就处于死锁状态。如果一个进程已经控制了文件中的一个加锁区域，然后它又试图对另一个进程控制的
区域加锁，那么它就会进入休眠，在这种情况下，有发生死锁的可能性。
*/
#include <fcntl.h>
#include <sys/stat.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "recordLock.h"
#include <errno.h>
#include <string.h>
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)

static void lockabyte(const char *name, int fd, off_t offset){
    if(writew_lock(fd, offset, SEEK_SET, 1) < 0){
        printf("writew_lock error\n, errno:%s\n", strerror(errno));
        return;
    }
    printf("%s: got the lock, byte %lld\n", name, (long long)offset);
}

int main(){
    int fd;
    pid_t pid;

    /*create a file and write two bytes to it*/
    if((fd = creat("templock", FILE_MODE)) < 0){
        printf("creat error\n");
        exit(1);
    }

    if(write(fd, "ab", 2) != 2){
        printf("write error\n");
        exit(1);
    }

    if((pid = fork()) < 0){
        printf("fork error\n");
    }else if(pid == 0){
        lockabyte("child", fd, 0);
        sleep(3);
        lockabyte("parent", fd, 1);
    }else{
        lockabyte("parent", fd, 1);
        sleep(3);
        lockabyte("child", fd, 0);
    }

    exit(0);
}